package com.xyzwps.collections.map;

public interface Map<K, V> {
    /**
     * 往映射中放入 key-value 对。
     */
    void put(K key, V value);

    /**
     * 兼容 Groovy 方括号语法。
     */
    default void putAt(K key, V value) {
        this.put(key, value);
    }

    /**
     * 按 key 查 value。
     * <p>
     * 如果 key 不存在则返回 {@code null}。
     */
    V get(K key);

    /**
     * 兼容 Groovy 方括号语法。
     */
    default V getAt(K key) {
        return this.get(key);
    }

    /**
     * 移除 key
     *
     * @return {@code true} 如果 key 真的存在，否则返回 {@code false}
     */
    boolean remove(K key);

    boolean hasKey(K key);

    /**
     * 兼容 Groovy `in` 操作符。
     */
    default boolean isCase(K key) {
        return this.hasKey(key);
    }

    /**
     * 映射中 key 的数量。
     */
    int size();

    default boolean isEmpty() {
        return this.size() == 0;
    }

    default boolean isNonEmpty() {
        return !this.isEmpty();
    }

    // TODO: keySet
    // TODO: 迭代
}
